Skip to main content

07 HTTP

HTTP协议

概述

HTTP的全程为Hyper Text Transfer Protocol,即超文本传输协议,规定了服务器和浏览器直接的数据传输规则。

HTTP协议基于TCP协议和请求-响应模型(一次请求对应一次响应),为无状态协议,没有记忆能力。也就是说,HTTP不能记忆数据,但速度较快。

请求协议

请求协议由请求行、请求头、请求体三部分组成。请求行为请求协议的第一行,请求头由数个键值对组成,请求体与请求头之间有一个空行。POST请求有请求体(存放参数),但GET请求没有。GET请求大小有限制,POST没有限制。

请求行包括请求方式、资源路径和协议。

常见请求体有以下几种。

名称请求内容
Host请求主机名
User-Agent浏览器版本
Accept浏览器能接收的资源类型,如文本、图片等
Accept-Language浏览器偏好语言(自然语言)
Accept-Encoding浏览器可以支持的压缩类型
Content-Type请求主体的数据类型
Content-Length请求主题的大小(单位为字节)

在获取请求数据时,不需要直接对协议进行操作,可以调用相应接口。在 HttpServletRequest 对象里封装了所有请求信息。

@RestController
public class requestController {

@RequestMapping("/request")
public String request(HttpServletRequest request) {
String method = request.getMethod();
String url = request.getRequestURL().toString();
String uri = request.getRequestURI();
String protocol = request.getProtocol();
String name = request.getParameter("name"); // 请求参数
String accept = request.getHeader("accept"); // 请求头

return "OK";
}
}

响应协议

响应协议也分为响应行、响应头、响应体三个部分。同样,响应行为第一行,响应头和响应体之间有空行。

响应行的内容为协议、状态码、描述。常见状态码和响应头内容如下。

状态码描述
1xx响应中
2xx响应成功
3xx重定向
4xx客户端错误
5xx服务器错误
响应头名称内容
Content-Type响应内容类型
Content-Length响应内容长度
Content-Encoding响应压缩算法
Cache-Control如何缓存
Set-Cookie为当前域设置Cookie

第一种设置响应数据的方式是通过 HttpServletResponse 类。

@RestController
public class responseController {

@RequestMapping("/response")
public void response(HttpServletResponse response) throws Exception {
response.setHeader("name", "test");
response.getWriter().write("<h1>Hello Request</h1>");
}
}

第二种方式是通过Spring提供的 ResponseEntity 类型。

@RestController
public class responseController {

@RequestMapping("/response2")
public ResponseEntity<String> response() {
return ResponseEntity
.status(401)
.header("name", "test")
.body("<h1>Hello Request</h1>");
}
}

通常来说,不需要手动设置状态码与响应头。